#include "Auto.h"

Auto::Auto() {
	this->pos = 0;
}

Auto::Auto(int id, long numeroEstacionamiento) {
	this->id = id;
	this->pos = 0;
	this->numeroEstacionamiento = numeroEstacionamiento;
	this->tiempoCirculando = Utils::calcularRandom(
			Utils::MAX_TIEMPO_AUTO_CIRCULANDO);
	this->tiempoEnEstacionar = Utils::calcularRandom(
			Utils::MAX_TIEMPO_AUTO_EN_ESTACIONAR);
	this->cantHoras = Utils::calcularRandom(Utils::MAX_TIEMPO_AUTO_ESTACIONADO);
	this->tiempoEnEstacionamiento = this->cantHoras + this->tiempoCirculando
			+ this->tiempoEnEstacionar;
	lock = new LockFile((char *) Utils::NOMBRE_ARCHIVO_PARA_LOG);

}

void Auto::estacionar() {
	string mensaje = "Ingreso el auto : " + to_string(id)
			+ " para estacionamiento : " + to_string(numeroEstacionamiento)
			+ "en la posicion: " + to_string(pos) + "\n";
	char* log = (char*) mensaje.c_str();
	lock->escribirConLock(log, strlen(log));
	sleep(this->tiempoCirculando); //Circula buscando su lugar.
	sleep(this->tiempoEnEstacionar); //Estaciona en su plaza.
	sleep(this->cantHoras); //Deja el auto "cantHoras" estacionado.
}

void Auto::salir() {
	string mensaje = "Se fue el auto : " + to_string(id)
			+ " del estacionamiento : " + to_string(numeroEstacionamiento)
			+ "que ocupaba la posicion" + to_string(pos) + "\n";
	char* log = (char*) mensaje.c_str();
	lock->escribirConLock(log, strlen(log));
	Cola<autoSerializable> salida(Utils::NOMBRE_ARCHIVO_SALIDA, 'A');
	autoSerializable dato;
	dato.mtype = this->numeroEstacionamiento + 1;
	dato.posicionOcupada = this->getPos();
	dato.tiempoEnElEstacionamiento = this->tiempoEnEstacionamiento;
	salida.escribir(dato);
}

int Auto::getTiempoEnEstacionar() {
	return tiempoEnEstacionar;
}

void Auto::setTiempoEnEstacionar(int timpoEnEstacionar) {
	this->tiempoEnEstacionar = timpoEnEstacionar;
}

int Auto::getCantHoras() {
	return cantHoras;
}

void Auto::setCantHoras(int cantHoras) {
	this->cantHoras = cantHoras;
}

int Auto::getTiempoCirculando() {
	return tiempoCirculando;
}

void Auto::setTiempoCirculando(int timpoCirculando) {
	this->tiempoCirculando = timpoCirculando;
}

int Auto::getId() {
	return id;
}

int Auto::getPos() {
	return this->pos;
}

void Auto::setPos(int pos) {
	this->pos = pos;
}

Auto::~Auto() {
}

long Auto::getNumeroEstacionamiento() {
	return numeroEstacionamiento;
}

void Auto::setNumeroEstacionamiento(long numeroEstacionamiento) {
	this->numeroEstacionamiento = numeroEstacionamiento;
}

int Auto::getTiempoEnEstacionamiento() {
	return tiempoEnEstacionamiento;
}

void Auto::setTiempoEnEstacionamiento(int tiempoEnEstacionamiento) {
	this->tiempoEnEstacionamiento = tiempoEnEstacionamiento;
}

